﻿using System;
using System.Collections.Generic;
using VisualPureBasicIDE.PureBasic.Forms.Gadgets;
using System.ComponentModel;


namespace VisualPureBasicIDE.PureBasic.Forms
{
    /// <summary>
    /// Struktur für zusätzliche Fensteroptionen
    /// </summary>
    public struct WindowFlags
    {
        public bool SystemMenu, MinimizeGadget, MaximizeGadget, SizeGadget, Invisible, TitleBar, BorderLess, ScreenCentered, WindowCentered;
    }

    /// <summary>
    /// Eine Basisklasse zum Erstellen eines PureBasic-Formulars
    /// </summary>
    [Serializable]
    public class PureBasicBaseForm
    {
        readonly string _myWindowID;
        string _myCaption;
        int _myStartPosX, _myStartPosY, _myStartWidth, _myStartHeight;
        WindowFlags _myFlags;
        List<IGadget> _myGadgets = new List<IGadget>();
        /// <summary>
        /// Erstellt eine neue Instanz der Klasse zum Erstellen eines neuen PureBasic-Formulars
        /// </summary>
        /// <param name="windowID">Ein eindeutiger Bezeichner für das Fenster (muss mit einem #-Zeichen beginnen)</param>
        /// <param name="caption">Der Text, der in der Titelleiste des Fensters steht</param>
        /// <param name="startPosX">Der X-Punkt, wo das Fenster beim Start erscheinen soll</param>
        /// <param name="startPosY">Der Y-Punkt, wo das Fenster beim Start erscheinen soll</param>
        /// <param name="startWidth">Die Startbreite des Fensters</param>
        /// <param name="startHeight">Die Starthöhe des Fensters</param>
        public PureBasicBaseForm(string windowID, string caption, int startPosX, int startPosY, int startWidth, int startHeight)
        {
            // Überprüfen, ob alle Argumente auch legal sind
            if (windowID == null) throw new ArgumentNullException("WindowID");
            if (windowID[0] != '#') throw new ArgumentException("A WindowID must start with an # char");
            _myWindowID = windowID;
            _myCaption = caption;
            if (startPosX < 0) throw new ArgumentException("The X position should not be lower than zero");
            _myStartPosX = startPosX;
            if (startPosY < 0) throw new ArgumentException("The Y position should not be lower than zero");
            _myStartPosY = startPosY;
            if (startWidth <= 0) throw new ArgumentException("The start width cannot be zero or lower than zero");
            _myStartWidth = startWidth;
            if (startHeight <= 0) throw new ArgumentException("The start height cannot be zero or lower than zero");
            _myStartHeight = startHeight;
            _myFlags = new WindowFlags { SystemMenu = true, SizeGadget = true, TitleBar = true };
        }

        /// <summary>
        /// Liefert alle auf dem Formular enthaltenen Gadgets als List zurück oder setzt sie
        /// </summary>
        [Category("Gadgets")]
        [ReadOnly(true)]
        public List<IGadget> InnerGadgets
        {
            get { return _myGadgets;}
            set { if (value != null) _myGadgets = value; }
        }

        /// <summary>
        /// Liefert den Bezeichner für das Fenster zurück
        /// </summary>
        [Category("Programmrelevant")]
        public string WindowID
        {
            get { return _myWindowID; }
        }

        /// <summary>
        /// Liefert die Fensterüberschrift zurück oder setzt sie
        /// </summary>
        [Category("Visuell")]
        public string Caption
        {
            get { return _myCaption; }
            set { _myCaption = value; }
        }

        /// <summary>
        /// Liefert den Start-X-Punkt zurück oder setzt ihn
        /// </summary>
        [Category("Visuell")]
        public int StartPosX
        {
            get { return _myStartPosX; }
            set { if (value > 0) _myStartPosX = value; }
        }

        /// <summary>
        /// Liefert den Start-Y-Punkt zurück oder setzt ihn
        /// </summary>
        [Category("Visuell")]
        public int StartPosY
        {
            get { return _myStartPosY; }
            set { if (value > 0) _myStartPosY = value; }
        }

        /// <summary>
        /// Liefert die Startbreite zurück oder setzt sie
        /// </summary>
        [Category("Visuell")]
        public int StartWidth
        {
            get { return _myStartWidth; }
            set { if (value > 0) _myStartWidth = value; }
        }

        /// <summary>
        /// Liefert die Starthöhe zurück oder setzt sie
        /// </summary>
        [Category("Visuell")]
        public int StartHeight
        {
            get { return _myStartHeight; }
            set { if (value > 0) _myStartHeight = value; }
        }

        public WindowFlags Flags
        {
            get { return _myFlags; }
            set { _myFlags = value; }
        }
    }
}